package queueasync;

import java.util.concurrent.BlockingQueue;

/**
 * 业务执行线程
 *
 * @author dingwen
 */
public class TaskExecutorThread extends Thread {
    /**
     * 任务队列
     * @code BlockingQueue 阻塞队列
     */
    private final BlockingQueue<Task> taskQueue;


    /**
     * 业务执行线程的当前处理事务状态 初始化：工作状态开启
     */
    private boolean isRunning = true;

    /**
     * 业务线程名称
     */
    private String businessHandlerThreadName;

    public TaskExecutorThread(BlockingQueue<Task> taskQueue, int index) {
        this.taskQueue = taskQueue;
        this.businessHandlerThreadName = generateBusinessHandlerThreadName(index);
    }

    /**
     * 生成业务线程名称
     *
     * @param index 指数
     * @return {@link String}
     */
    public String generateBusinessHandlerThreadName(int index) {
        return "第" + index + "业务处理线程";
    }

    /**
     * 退出当前任务线程
     */
    public void quit() {
        isRunning = false;
        interrupt();
    }

    @Override
    public void run() {
        // 窗口工作开启状态时 等待处理事务

        while (isRunning) {
            Task task = null;
            try {
                //从队列中取出任务
                task = taskQueue.take();
                // 执行任务
                Object execute = task.execute();
                TaskManagement.resultMap.put(task.hashCode(),execute);
                System.out.println(businessHandlerThreadName);

            } catch (InterruptedException e) {
                if (!isRunning) {
                    // 发生意外了，是下班状态的话就把当前业务处理线程关闭。
                    interrupt();
                    // 如果执行到break，后面的代码就无效了。
                    break;
                }
                // 发生意外了，改业务处理现在继续工作
                System.out.println("发生意外了，改业务处理现在继续工作");
                System.out.println(task.getData());
            }

        }
    }

}

